#include <cstdio>
#include <cstdlib>
#include <cstring>
#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif
#include "Affichage.h"
#include <windows.h>
#include <SDL/SDL_ttf.h>
#include <ctime>

#include "DesJoueurs.H"
#include "Case.H"
#include "Joueur.H"
#include "Partie.H"
#include "Plateau.H"
#include "CaisseAPoint.H"
#include "CarteQuestion.H"
#include "Affichage.H"

#include <unistd.h>


void initPartie(SDL_Surface* ecran,Partie & p)
{
    int nbJoueurs=0;
    int scoreFinal=0;
    debutPartie(ecran,nbJoueurs,scoreFinal);
    p.NbJoueur=nbJoueurs;
    p.ScoreFinal=scoreFinal;
    initDesJoueurs(ecran, p.DJ,nbJoueurs);
    initCaisseAPoint(p.CAP);
    initPlateau();
    p.tabQuestions[0]=initCarteQuestionBio();
    p.tabQuestions[1]=initCarteQuestionMaths();
    p.tabQuestions[2]=initCarteQuestionInfo();
    p.tabQuestions[3]=initCarteQuestionCG();
    affichageScoreDesJoueurs(ecran,p.DJ);
    affichageCaisseAPoints(ecran,0);
    deplaceJoueurSDL(ecran,p);
}


int nbJoueursPartie(Partie & p)
{
    return p.NbJoueur;
}


int scoreFinalPartie(Partie & p)
{
    return p.ScoreFinal;
}

DesJoueurs DesJoueursPartie(Partie & p)
{
    return p.DJ;
}


CaisseAPoint CaisseAPointPartie(Partie & p)
{
    return p.CAP;
}

CarteQuestion renvoieCarteQuestionPartie(Partie & p,int matiere, int nb_alea)
{
    return p.tabQuestions[matiere][nb_alea];
}

void deroulementCoupPartie(SDL_Surface* ecran,Partie & p, Joueur & j)
{
    int score=scoreJoueur(j);
    int nbCAP=pointCaisseAPoint(p.CAP);
    DesJoueurs dj=DesJoueursPartie(p);
    int nbJoueurs=nbJoueursPartie(p);
    affichageCompteurs(ecran,j);
    affichageScoreDesJoueurs(ecran,p.DJ);
    affichageCaisseAPoints(ecran, nbCAP);

    int nbCartePST=nbCartePasseSonTourJoueur(j);
    if(nbCartePST>0)
    {
        printf("Vous devez passer votre tour \n");
        affichagePasseTour(ecran,j);
        decrementeNbCartePasseSonTourJoueur(j);
        score=scoreJoueur(j);
        affichageScoreDesJoueurs(ecran,p.DJ);
    }
    else
    {
        int compteurGuillet=compteurGuilletJoueur(j);
        if(compteurGuillet>0)
        {
            bool g=actionCaseGuillet(ecran,j,p.DJ);
            deplaceJoueurSDL(ecran,p);
            if(g==true)
            {
                int pos=positionJoueur(j);
                Case c=casePlateau(pos);
                actionCase(ecran,p.tabQuestions,c,j,dj,p.CAP,nbJoueurs);
            }
            score=scoreJoueur(j);
            affichageScoreDesJoueurs(ecran,p.DJ);
        }
        else
        {
            int l=0;
            deplaceJoueur(j,l);
            char* nomJ=nomJoueur(j);
            pause(ecran, nomJ, l);
            int pos=positionJoueur(j);
            Case c=casePlateau(pos);
            deplaceJoueurSDL(ecran,p);
            actionCase(ecran,p.tabQuestions,c,j,dj,p.CAP,nbJoueurs);
            deplaceJoueurSDL(ecran,p);
            affichageScoreDesJoueurs(ecran,p.DJ);
        }
    }
}



static bool deroulementPartieBis(SDL_Surface* ecran,Partie & p, int k)
{

    int nbJoueurs=nbJoueursPartie(p);
    int scorePartie=scoreFinalPartie(p);
    for(int i=0; i<nbJoueurs; i++)
    {
        Joueur j= joueurNumPassageDesJoueurs(p.DJ, i);
        int score=scoreJoueur(j);
        if(score>=scorePartie)
        {
            char* nomGagnant=nomJoueur(j);
            affichageFinPartie(ecran,nomGagnant);
            finPartie(p,j);
            exit(1);
        }
    }
    Joueur& j= joueurNumPassageDesJoueurs(p.DJ, k);
    deroulementCoupPartie(ecran,p,j);
    deroulementPartieBis(ecran,p,(k+1)%nbJoueurs);
    return false;
}

void deroulementPartie(SDL_Surface* ecran,Partie & p)
{
    bool b= deroulementPartieBis(ecran,p,0);
    if (b==false)
    {
        printf("Gros probleme de chargement de la partie, veuillez consulter le vendeur...");
    }
}


void finPartie(Partie & p, Joueur & j)
{
    eliminationDesJoueurs(p.DJ);
    delete [] p.tabQuestions[0];
    delete [] p.tabQuestions[1];
    delete [] p.tabQuestions[2];
    delete [] p.tabQuestions[3];
}
